package com.wx.tedu.file;

import java.io.*;

/**
 * 处理关于txt的文件，
 *
 * @author 29623
 * @see #foundImg(String, String, String) 根据需要的结果集，在指定的文件夹中寻找目标文件，输出到指定的文件夹中
 * @see #foundFile(File, String)  根据指定文件集寻找目标文件
 * @see #copyPng(File, File)  根据源文件，复写一份文件到指定的文件夹中（新文件名默认为源文件名）
 */
public class FileMethodTxt {

    /**
     * 从A文件对比B文件寻找非交集生成一份A和B的非交集txt
     */


    /**
     * foundImg
     *
     * @param allFileDirName  读取文件夹下的文件（.png.txt......）
     * @param foundFileName   根据提供的txt行内容匹配文件（.png）
     * @param saveFileDirName 将匹配到的txt行和文件（.png）复写到指定的文件夹
     */
    public void foundImg(String allFileDirName, String foundFileName, String saveFileDirName) {

        //将传入的allFileDirName初始化为file类型
        File oldDir = new File(allFileDirName);
        //判定oldDir是否是文件夹并存在
        if (oldDir.isDirectory() && oldDir.exists()) {
            //获取oldDir下所有的文件
            File[] subFiles = oldDir.listFiles();
            //判定oldDir下是否有文件
            if (subFiles != null && subFiles.length > 0) {
                //提示oldDir下文件总数
                System.out.println(allFileDirName + "下共有文件项：" + subFiles.length);
                //将传入的saveFileDirName初始化为file类型
                File newDir = new File(saveFileDirName);
                //判定newDir是否是文件夹并存在
                if (newDir.isDirectory() && newDir.exists()) {
                    //将比对文件转换file
                    File resultFile = new File(foundFileName);
                    //判定resultFile是否存在且不为空
                    if (resultFile.exists() && resultFile.length() > 0) {
                        //开始比对文件夹下的文件名字是否满足提供的txt行内容
                        for (File subFile : subFiles) {
                            //判定相同开始复写
                            if (foundFile(resultFile, subFile.getName()) != null) {
                                copyPng(new File(oldDir + "/" + subFile.getName()), new File(newDir + "/" + subFile.getName()));
                            }
                        }
                        System.out.println("Method is successfully!");
                    } else {
                        System.out.println(saveFileDirName + " is not a file or is null file!!!");
                    }
                } else {
                    System.out.println(saveFileDirName + " is not a directory or not exists!!!");
                    if (newDir.mkdirs()) {
                        System.out.println(saveFileDirName + " is exists!!!");
                        //自调用
                        foundImg(allFileDirName, foundFileName, saveFileDirName);
                    } else {
                        System.out.println(saveFileDirName + " is failed!!!");
                    }
                }
            } else {
                System.out.println(allFileDirName + " 下没有文件！");
            }
        } else {
            System.out.println(allFileDirName + " is not a directory or not exists!!!");
            if (oldDir.mkdirs()) {
                System.out.println(allFileDirName + " is exists");
                //自调用
                foundImg(allFileDirName, foundFileName, saveFileDirName);
            } else {
                System.out.println(allFileDirName + " is failed");
            }
        }

    }

    /**
     * foundImgReplaceName
     *
     * @param allFileDirName      读取文件夹下的文件（.png.txt......）
     * @param foundFileName       根据提供的txt行内容匹配文件（.png）
     * @param splitString         根据指定正则格式字符分隔
     * @param connationNameString 根据指定的格式拼接
     * @param saveFileDirName     将匹配到的txt行和文件（.png）复写到指定的文件夹
     */
    public void foundImgReplaceName(String allFileDirName, String foundFileName,
                                    String splitString, String connationNameString, String saveFileDirName) {
        String[] replaceName;

        //将传入的allFileDirName初始化为file类型
        File oldDir = new File(allFileDirName);
        //判定oldDir是否是文件夹并存在
        if (oldDir.isDirectory() && oldDir.exists()) {
            //获取oldDir下所有的文件
            File[] subFiles = oldDir.listFiles();
            //判定oldDir下是否有文件
            if (subFiles != null && subFiles.length > 0) {
                //提示oldDir下文件总数
                System.out.println(allFileDirName + "下共有文件项：" + subFiles.length);
                //将传入的saveFileDirName初始化为file类型
                File newDir = new File(saveFileDirName);
                //判定newDir是否是文件夹并存在
                if (newDir.isDirectory() && newDir.exists()) {
                    //将比对文件转换file
                    File resultFile = new File(foundFileName);
                    //判定resultFile是否存在且不为空
                    if (resultFile.exists() && resultFile.length() > 0) {
                        //开始比对文件夹下的文件名字是否满足提供的txt行内容
                        for (File subFile : subFiles) {
                            //判定相同开始复写
                            if (foundFile(resultFile, subFile.getName()) != null) {
                                replaceName = subFile.getName().split(splitString);
                                copyPng(new File(oldDir + "/" + subFile.getName()),
                                        new File(newDir + "/" + (replaceName[0] + connationNameString + replaceName[replaceName.length - 1])));
                            }
                        }
                        System.out.println("Method is successfully!");
                    } else {
                        System.out.println(resultFile + " is not a file or is null file!!!");
                    }
                } else {
                    System.out.println(saveFileDirName + " is not a directory or not exists!!!");
                    if (newDir.mkdirs()) {
                        System.out.println(saveFileDirName + " is exists!!!");
                        //自调用
                        foundImgReplaceName(allFileDirName, foundFileName, saveFileDirName, splitString, connationNameString);
                    } else {
                        System.out.println(saveFileDirName + "is failed!!!");
                    }
                }
            } else {
                System.out.println(allFileDirName + "下没有文件！");
            }
        } else {
            System.out.println(allFileDirName + " is not a directory or not exists!!!");
            if (oldDir.mkdirs()) {
                System.out.println(allFileDirName + "is exists");
                //自调用
                foundImgReplaceName(allFileDirName, foundFileName, saveFileDirName, splitString, connationNameString);
            } else {
                System.out.println(allFileDirName + "is failed");
            }
        }


    }

    /**
     * 复写图片
     *
     * @param oldDir 文件源
     * @param newDir 文件复写地址
     */
    public void copyPng(File oldDir, File newDir) {
        try {
            int png;
            //获取图片原路径
            FileInputStream fis = new FileInputStream(oldDir);
            BufferedInputStream bis = new BufferedInputStream(fis);
            //复写图片新路径
            FileOutputStream fos = new FileOutputStream(newDir);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            while ((png = bis.read()) != -1) {
                bos.write(png);
                bos.flush();
            }
            bis.close();
            bos.close();
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage());
        }

    }

    /**
     * 比对txt行内容与文件(原文件名是否相同)
     *
     * @param resultFile 比对结果集文件
     * @param subFile    需要对比的文件名
     */
    public String foundFile(File resultFile, String subFile) {
        try {
            FileReader reader = new FileReader(resultFile);
            BufferedReader br = new BufferedReader(reader);
            String lineInfo;
            while ((lineInfo = br.readLine()) != null) {
                //txt行内容和传过来的值相同直接返回
                if (lineInfo.equals(subFile)) {
                    br.close();
                    return lineInfo;
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage());
        }
        return null;
    }
}
